Immune cell subsetting
Subset immune cells
allcells_css = readRDS(file = "data/processed/allcells_css.RDS")
Lymphoid cell analysis
Subset Lymphoid cells


DimPlot(all_imm_cells, reduction = "umap", group.by = "Condition")
DimPlot(all_imm_cells, reduction = "umap", group.by = "allcells_clusters")
DimPlot(all_imm_cells, reduction = "umap", group.by = "Donor")

DimPlot(all_imm_cells, reduction = "umap", group.by = "Phase")

FeaturePlot(all_imm_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
"CLEC1B", "CLEC14A", "PTPRC", "EPCAM",
"CD14", "TRAC", "CD3E", "CD8A"))

Cluster and get markers


all_l_cells = RunUMAP(all_l_cells, dims = 1:25, verbose = F)
DimPlot(all_l_cells, reduction = "umap", group.by = "Condition")
DimPlot(all_l_cells, reduction = "umap", group.by = "allcells_clusters")
DimPlot(all_l_cells, reduction = "umap", group.by = "Donor")

DimPlot(all_l_cells, reduction = "umap", group.by = "Phase")

FeaturePlot(all_l_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
"NKG7", "TRGC1", "PTPRC", "EPCAM",
"CD14", "TRAC", "CD3E", "CD8A"))

Add annotations


DimPlot(all_l_cells, reduction = "umap", group.by = "pca25_res.0.4", label = T)
DimPlot(all_l_cells, reduction = "umap", group.by = "Donor", label = F)
DimPlot(all_l_cells, reduction = "umap", group.by = "Condition", label = F)

Subset T/NK cells
new_l_labs = c("0" = "ab-T cells 1",
"1" = "NK/gd-T cells",
"2" = "ab-T cells 2",
"3" = "Infiltrating NK cells", # PTGDS,CX3CR1 (infilt)
"4" = "IgA+ Plasma cells",
"5" = "B cells",
"6" = "IgG+ Plasma cells",
"7" = "Dividing NK cells",
"8" = "ab-T cells (stress)")
all_l_cells$lymphoid_annot = new_l_labs[as.character(all_l_cells$pca25_res.0.4)]
Cluster and get markers
immune_pops = c("ab-T cells 1", "ab-T cells 2", "NK/gd-T cells", "Infiltrating NK cells")
all_t_cells = all_l_cells[,all_l_cells@meta.data$lymphoid_annot %in% immune_pops]
all_t_cells = suppressWarnings(SCTransform(all_t_cells, do.correct.umi = T, verbose = F,
vars.to.regress=c("unique_name","nCount_RNA"),
variable.features.rv.th = 1, seed.use = 1,
return.only.var.genes = F,
variable.features.n = NULL))
all_t_cells = RunPCA(all_t_cells, verbose = F)
all_t_cells = RunUMAP(all_t_cells, dims = 1:25, verbose = F)
DimPlot(all_t_cells, reduction = "umap", group.by = "Condition")

DimPlot(all_t_cells, reduction = "umap", group.by = "allcells_clusters")

DimPlot(all_t_cells, reduction = "umap", group.by = "lymphoid_annot")

DimPlot(all_t_cells, reduction = "umap", group.by = "Donor")

DimPlot(all_t_cells, reduction = "umap", group.by = "Phase")

FeaturePlot(all_t_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
"NKG7", "TRGC1", "PTPRC", "EPCAM",
"CD14", "TRAC", "CD3E", "CD8A"))

# https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5007630/
new_t_labs = c("0" = "NK cells 1",
"1" = "TRM cells", # may have CD4 and CD8; ITGA1
"2" = "MAIT cells 2", # CXCR6, CCR6, CCR5, some RORC (not DE with the ILC3), some ZBTB16
"3" = "NK cells 2",
"4" = "NK cells 3",
"5" = "CD8 ab-T cells 2",
"6" = "MAIT cells 1", # hard to be sure, but has many hallmarks, even higher CD8A
"7" = "Infiltrating NK cells",
"8" = "Naive CD4+ T cells",
"9" = "gd-T cells", # CD3+ vs cl7, TRDC/TRG
"10" = "CD8 ab-T cells 3",
"11" = "CD8 ab-T cells 1",
"12" = "Treg",
"13" = "ILC3") # KIT, AHR, RORC, no CD3/CD8/CD4
all_t_cells$t_annot = new_t_labs[as.character(all_t_cells$pca25_res.0.9)]
Myeloid cell analysis
Subset Myeloid cells
# https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5007630/
new_t_labs = c("0" = "NK cells 1",
"1" = "TRM cells", # may have CD4 and CD8; ITGA1
"2" = "MAIT cells 2", # CXCR6, CCR6, CCR5, some RORC (not DE with the ILC3), some ZBTB16
"3" = "NK cells 2",
"4" = "NK cells 3",
"5" = "CD8 ab-T cells 2",
"6" = "MAIT cells 1", # hard to be sure, but has many hallmarks, even higher CD8A
"7" = "Infiltrating NK cells",
"8" = "Naive CD4+ T cells",
"9" = "gd-T cells", # CD3+ vs cl7, TRDC/TRG
"10" = "CD8 ab-T cells 3",
"11" = "CD8 ab-T cells 1",
"12" = "Treg",
"13" = "ILC3") # KIT, AHR, RORC, no CD3/CD8/CD4
Clustering and markers
immune_pops = c("cDCs 2", "Macrophages", "Kupffer cells", "cDCs 1", "pDCs")
all_m_cells = allcells_css[,allcells_css@meta.data$allcells_clusters %in% immune_pops]
all_m_cells = suppressWarnings(SCTransform(all_m_cells, do.correct.umi = T, verbose = F,
vars.to.regress=c("unique_name","nCount_RNA"),
variable.features.rv.th = 1, seed.use = 1,
return.only.var.genes = F,
variable.features.n = NULL))
all_m_cells = RunPCA(all_m_cells, verbose = F)
all_m_cells = RunUMAP(all_m_cells, dims = 1:25, verbose = F)
DimPlot(all_m_cells, reduction = "umap", group.by = "Condition")

DimPlot(all_m_cells, reduction = "umap", group.by = "allcells_clusters")

DimPlot(all_m_cells, reduction = "umap", group.by = "Donor")

DimPlot(all_m_cells, reduction = "umap", group.by = "Phase")

FeaturePlot(all_m_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
"NKG7", "TRGC1", "PTPRC", "EPCAM",
"CD14", "TRAC", "CD3E", "CD8A"))

Add annotations
mrks_q = SoupX::quickMarkers(all_m_cells@assays$SCT@counts,
all_m_cells@active.ident, N = 10)
View(mrks_q[mrks_q$qval<=0.05,])
new_m_labs = c("0" = "Kupffer cells",
"1" = "Monocytes/cDCs",
"2" = "Macrophages",
"3" = "Monocytes/cDCs",
"4" = "Kupffer cells",
"5" = "Monocytes/cDCs",
"6" = "Monocytes/cDCs",
"7" = "Macrophages",
"8" = "Monocytes/cDCs",
"9" = "cDC1",
"10" = "pDCs",
"11" = "pDCs",
"12" = "Dividing cDCs",
"13" = "Kupffer cells",
"14" = "Hepatocytes")
all_m_cells$mye_annot = new_m_labs[as.character(all_m_cells$pca25_res.0.6)]
Subset Monocytes
immune_pops = c("2", "7", "1", "6", "8", "3", "5", "4", "13", "0", "9")
all_mon_cells = all_m_cells[,all_m_cells@meta.data$pca25_res.0.6 %in% immune_pops &
all_m_cells@meta.data$allcells_clusters %in% c("Macrophages", "cDCs 1",
"cDCs 2", "Kupffer cells")]
all_mon_cells = suppressWarnings(SCTransform(all_mon_cells, do.correct.umi = T, verbose = F,
vars.to.regress=c("unique_name","nCount_RNA"),
variable.features.rv.th = 1, seed.use = 1,
return.only.var.genes = F,
variable.features.n = NULL))
all_mon_cells = RunPCA(all_mon_cells, verbose = F)
all_mon_cells = RunUMAP(all_mon_cells, dims = 1:25, verbose = F)
DimPlot(all_mon_cells, reduction = "umap", group.by = "Condition")
DimPlot(all_mon_cells, reduction = "umap", group.by = "allcells_clusters")
DimPlot(all_mon_cells, reduction = "umap", group.by = "pca25_res.0.6")
DimPlot(all_mon_cells, reduction = "umap", group.by = "Donor")
DimPlot(all_mon_cells, reduction = "umap", group.by = "Phase")
FeaturePlot(all_mon_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
"NKG7", "TRGC1", "PTPRC", "EPCAM",
"CD14", "TRAC", "CD3E", "CD8A"))
Clustering and markers
immune_pops = c("2", "7", "1", "6", "8", "3", "5", "4", "13", "0", "9")
all_mon_cells = all_m_cells[,all_m_cells@meta.data$pca25_res.0.6 %in% immune_pops &
all_m_cells@meta.data$allcells_clusters %in% c("Macrophages", "cDCs 1",
"cDCs 2", "Kupffer cells")]
all_mon_cells = suppressWarnings(SCTransform(all_mon_cells, do.correct.umi = T, verbose = F,
vars.to.regress=c("unique_name","nCount_RNA"),
variable.features.rv.th = 1, seed.use = 1,
return.only.var.genes = F,
variable.features.n = NULL))
all_mon_cells = RunPCA(all_mon_cells, verbose = F)
all_mon_cells = RunUMAP(all_mon_cells, dims = 1:25, verbose = F)
DimPlot(all_mon_cells, reduction = "umap", group.by = "Condition")

DimPlot(all_mon_cells, reduction = "umap", group.by = "allcells_clusters")

DimPlot(all_mon_cells, reduction = "umap", group.by = "pca25_res.0.6")

DimPlot(all_mon_cells, reduction = "umap", group.by = "Donor")

DimPlot(all_mon_cells, reduction = "umap", group.by = "Phase")

FeaturePlot(all_mon_cells, reduction = "umap", features = c("MKI67", "ALB", "S100A8", "COLEC11",
"NKG7", "TRGC1", "PTPRC", "EPCAM",
"CD14", "TRAC", "CD3E", "CD8A"))

Add annotations


DimPlot(all_mon_cells, reduction = "umap", group.by = "pca25_res.0.5", label = T)
DimPlot(all_mon_cells, reduction = "umap", group.by = "allcells_clusters", label = T)
DimPlot(all_mon_cells, reduction = "umap", group.by = "Donor", label = F)

DimPlot(all_mon_cells, reduction = "umap", group.by = "Condition", label = F)

Put annotations on single immune cell object
Make dataframe with new annotations
new_m_labs = c("0" = "Kupffer cells",
"1" = "cDC2",
"2" = "Monocytes (IGSF21+ GPR34+)", # similar to those identified here https://www.nature.com/articles/s41586-020-2922-4
"3" = "Macrophages (HES4+)", # very similar to 5, HES4 is one of its most unique markers
"4" = "Kupffer cells (SUCNR1+)", # disproves https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1986575/; these KC are inflammatory/antiviral
"5" = "Macrophages",
"6" = "Monocytes (TREM2+ CD9+)", # in ramachandran et al, assoc with fibrotic scars
## in their projection, also close to KC
"7" = "cDC2",
"8" = "cDC1",
"9" = "Monocytes (secretory)", # related to 2 and 6
"10" = "activated DCs") # CD80, CD86, CCR7
all_mon_cells$mono_annot = new_m_labs[as.character(all_mon_cells$pca25_res.0.5)]
Add to the immune Seurat object
all_imm_cells = AddMetaData(all_imm_cells, metadata = newannot_df)
# the original "Dividing cells" will be relabeled "Dividing T/NK cells",
## and the newly annotated "Dividing NK cells" will be renamed to match this
all_imm_cells$immune_annot[is.na(all_imm_cells$immune_annot)] = "Dividing T/NK cells"
all_imm_cells$immune_annot[all_imm_cells$immune_annot=="Dividing NK cells"] = "Dividing T/NK cells"
all_imm_cells$immune_annot[all_imm_cells$immune_annot=="Hepatocytes"] = "Hepatocyte-Monocyte interaction"
DimPlot(all_l_cells, group.by = "lymphoid_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Lymphoid cells")
DimPlot(all_t_cells, group.by = "t_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("T and NK cells (subset of Lymphoid)")
DimPlot(all_m_cells, group.by = "mye_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Myeloid cells")
DimPlot(all_mon_cells, group.by = "mono_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Monocytes cells (subset of Myeloid)")
DimPlot(all_imm_cells, group.by = "allcells_clusters", reduction = "umap", label = T)+NoLegend()+ggtitle("Immune cells (original annotation)")
DimPlot(all_imm_cells, group.by = "immune_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Immune cells (new detailed annotation)")
Save Seurat objects
all_imm_cells = AddMetaData(all_imm_cells, metadata = newannot_df)
# the original "Dividing cells" will be relabeled "Dividing T/NK cells",
## and the newly annotated "Dividing NK cells" will be renamed to match this
all_imm_cells$immune_annot[is.na(all_imm_cells$immune_annot)] = "Dividing T/NK cells"
all_imm_cells$immune_annot[all_imm_cells$immune_annot=="Dividing NK cells"] = "Dividing T/NK cells"
all_imm_cells$immune_annot[all_imm_cells$immune_annot=="Hepatocytes"] = "Hepatocyte-Monocyte interaction"
DimPlot(all_l_cells, group.by = "lymphoid_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Lymphoid cells")

DimPlot(all_t_cells, group.by = "t_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("T and NK cells (subset of Lymphoid)")

DimPlot(all_m_cells, group.by = "mye_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Myeloid cells")

DimPlot(all_mon_cells, group.by = "mono_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Monocytes cells (subset of Myeloid)")

DimPlot(all_imm_cells, group.by = "allcells_clusters", reduction = "umap", label = T)+NoLegend()+ggtitle("Immune cells (original annotation)")

DimPlot(all_imm_cells, group.by = "immune_annot", reduction = "umap", label = T)+NoLegend()+ggtitle("Immune cells (new detailed annotation)")

LS0tCnRpdGxlOiAiSW1tdW5lIHBvcHVsYXRpb24gYW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgoKIyBHZW5lcmFsIFNldHVwClNldHVwIGNodW5rCgpgYGB7ciwgc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSA4KQprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9IG5vcm1hbGl6ZVBhdGgoIi4uIikpCmtuaXRyOjpvcHRzX2tuaXQkZ2V0KCJyb290LmRpciIpCmBgYAoKU2V0dXAgcmV0aWN1bGF0ZQoKYGBge3J9CmxpYnJhcnkocmV0aWN1bGF0ZSkKa25pdHI6OmtuaXRfZW5naW5lcyRzZXQocHl0aG9uID0gcmV0aWN1bGF0ZTo6ZW5nX3B5dGhvbikKcHlfYXZhaWxhYmxlKGluaXRpYWxpemUgPSBGQUxTRSkKdXNlX3B5dGhvbihTeXMud2hpY2goInB5dGhvbiIpKQpweV9jb25maWcoKQpgYGAKCkxvYWQgbGlicmFyaWVzCgpgYGB7cn0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkZXN0aW55KQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpgYGAKCkxvYWQgZGF0YSAoZnJvbSBhbGwgY2VsbHMpCgpgYGB7cn0KYWxsY2VsbHNfY3NzID0gcmVhZFJEUyhmaWxlID0gImRhdGEvcHJvY2Vzc2VkL2FsbGNlbGxzX2Nzcy5SRFMiKQpgYGAKCgoKIyBJbW11bmUgY2VsbCBzdWJzZXR0aW5nClN1YnNldCBpbW11bmUgY2VsbHMKCmBgYHtyfQojIHRoZSBkaXZpZGluZyBjZWxscyBhcmUgVC9OSywgd2lsbCB1cGRhdGUgbGFiZWwgYXQgdGhlIGVuZAppbW11bmVfcG9wcyA9IGMoImFiLVQgY2VsbHMiLCAiZ2QtVCBjZWxscyIsIAogICAgICAgICAgICAgICAgIlBsYXNtYWJsYXN0cyIsICJjRENzIDIiLCAKICAgICAgICAgICAgICAgICJNYWNyb3BoYWdlcyIsICJLdXBmZmVyIGNlbGxzIiwKICAgICAgICAgICAgICAgICJCIGNlbGxzIiwgICJjRENzIDEiLCAicERDcyIsICJEaXZpZGluZyBjZWxscyIpCmFsbF9pbW1fY2VsbHMgPSBhbGxjZWxsc19jc3NbLGFsbGNlbGxzX2Nzc0BtZXRhLmRhdGEkYWxsY2VsbHNfY2x1c3RlcnMgJWluJSBpbW11bmVfcG9wc10KYWxsX2ltbV9jZWxscyA9IHN1cHByZXNzV2FybmluZ3MoU0NUcmFuc2Zvcm0oYWxsX2ltbV9jZWxscywgZG8uY29ycmVjdC51bWkgPSBULCB2ZXJib3NlID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcz1jKCJ1bmlxdWVfbmFtZSIsIm5Db3VudF9STkEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmVhdHVyZXMucnYudGggPSAxLCBzZWVkLnVzZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi5vbmx5LnZhci5nZW5lcyA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5mZWF0dXJlcy5uID0gTlVMTCkpCmFsbF9pbW1fY2VsbHMgPSBSdW5QQ0EoYWxsX2ltbV9jZWxscywgdmVyYm9zZSA9IEYpCmFsbF9pbW1fY2VsbHMgPSBSdW5VTUFQKGFsbF9pbW1fY2VsbHMsIGRpbXMgPSAxOjI1LCB2ZXJib3NlID0gRikKRGltUGxvdChhbGxfaW1tX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkNvbmRpdGlvbiIpCkRpbVBsb3QoYWxsX2ltbV9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJhbGxjZWxsc19jbHVzdGVycyIpCkRpbVBsb3QoYWxsX2ltbV9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJEb25vciIpCkRpbVBsb3QoYWxsX2ltbV9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJQaGFzZSIpCkZlYXR1cmVQbG90KGFsbF9pbW1fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZmVhdHVyZXMgPSBjKCJNS0k2NyIsICJBTEIiLCAiUzEwMEE4IiwgIkNPTEVDMTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xFQzFCIiwgIkNMRUMxNEEiLCAiUFRQUkMiLCAiRVBDQU0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCIsICJUUkFDIiwgIkNEM0UiLCAiQ0Q4QSIpKQpgYGAKCgojIyBMeW1waG9pZCBjZWxsIGFuYWx5c2lzClN1YnNldCBMeW1waG9pZCBjZWxscwoKYGBge3J9CmltbXVuZV9wb3BzID0gYygiYWItVCBjZWxscyIsICJnZC1UIGNlbGxzIiwgIlBsYXNtYWJsYXN0cyIsICJCIGNlbGxzIikKYWxsX2xfY2VsbHMgPSBhbGxjZWxsc19jc3NbLGFsbGNlbGxzX2Nzc0BtZXRhLmRhdGEkYWxsY2VsbHNfY2x1c3RlcnMgJWluJSBpbW11bmVfcG9wc10KYWxsX2xfY2VsbHMgPSBzdXBwcmVzc1dhcm5pbmdzKFNDVHJhbnNmb3JtKGFsbF9sX2NlbGxzLCBkby5jb3JyZWN0LnVtaSA9IFQsIHZlcmJvc2UgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycy50by5yZWdyZXNzPWMoInVuaXF1ZV9uYW1lIiwibkNvdW50X1JOQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5mZWF0dXJlcy5ydi50aCA9IDEsIHNlZWQudXNlID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLm9ubHkudmFyLmdlbmVzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZlYXR1cmVzLm4gPSBOVUxMKSkKYWxsX2xfY2VsbHMgPSBSdW5QQ0EoYWxsX2xfY2VsbHMsIHZlcmJvc2UgPSBGKQphbGxfbF9jZWxscyA9IFJ1blVNQVAoYWxsX2xfY2VsbHMsIGRpbXMgPSAxOjI1LCB2ZXJib3NlID0gRikKRGltUGxvdChhbGxfbF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJDb25kaXRpb24iKQpEaW1QbG90KGFsbF9sX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImFsbGNlbGxzX2NsdXN0ZXJzIikKRGltUGxvdChhbGxfbF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJEb25vciIpCkRpbVBsb3QoYWxsX2xfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiUGhhc2UiKQpGZWF0dXJlUGxvdChhbGxfbF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBmZWF0dXJlcyA9IGMoIk1LSTY3IiwgIkFMQiIsICJTMTAwQTgiLCAiQ09MRUMxMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOS0c3IiwgIlRSR0MxIiwgIlBUUFJDIiwgIkVQQ0FNIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQiLCAiVFJBQyIsICJDRDNFIiwgIkNEOEEiKSkKYGBgCgpDbHVzdGVyIGFuZCBnZXQgbWFya2VycwoKYGBge3J9CmFsbF9sX2NlbGxzID0gRmluZE5laWdoYm9ycyhhbGxfbF9jZWxscywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ1bmUuU05OID0gMS81LCBmb3JjZS5yZWNhbGMgPSBULCBncmFwaC5uYW1lID0gInBjYTI1IikKYWxsX2xfY2VsbHMgPSBGaW5kQ2x1c3RlcnMoYWxsX2xfY2VsbHMsIGFsZ29yaXRobSA9IDIsIHZlcmJvc2UgPSBGLCBncmFwaC5uYW1lID0gInBjYTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHNlcSgwLjEsIDIsIDAuMSkpCkRpbVBsb3QoYWxsX2xfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAicGNhMjVfcmVzLjAuNCIsIGxhYmVsID0gVCkKRGltUGxvdChhbGxfbF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJEb25vciIsIGxhYmVsID0gRikKRGltUGxvdChhbGxfbF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJDb25kaXRpb24iLCBsYWJlbCA9IEYpCgphbGxfbF9jZWxscyA9IFNldElkZW50KGFsbF9sX2NlbGxzLCB2YWx1ZSA9ICJwY2EyNV9yZXMuMC40IikKbWtfbGNlbGxzID0gRmluZEFsbE1hcmtlcnMoYWxsX2xfY2VsbHMsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMiwgcHNldWRvY291bnQudXNlID0gMC4xKQp3cml0ZS5jc3YobWtfbGNlbGxzW21rX2xjZWxscyRwX3ZhbF9hZGo8PTAuMDUsXSwgCiAgICAgICAgICBmaWxlID0gInJlc3VsdHMvaW1tdW5lL21hcmtlcnNfbHltcGhvaWRfc3VicG9wX2FsbC5jc3YiLCByb3cubmFtZXMgPSBULCBxdW90ZSA9IEYpCgoKbWswMiA9IEZpbmRNYXJrZXJzKGFsbF9sX2NlbGxzLCBpZGVudC4xID0gIjAiLCBpZGVudC4yID0gIjIiLCAKICAgICAgICAgICAgICAgICAgIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMiwgcHNldWRvY291bnQudXNlID0gMC4xKQpgYGAKCkFkZCBhbm5vdGF0aW9ucwoKYGBge3J9Cm5ld19sX2xhYnMgPSBjKCIwIiA9ICJhYi1UIGNlbGxzIDEiLAogICAgICAgICAgICAgICAiMSIgPSAiTksvZ2QtVCBjZWxscyIsCiAgICAgICAgICAgICAgICIyIiA9ICJhYi1UIGNlbGxzIDIiLAogICAgICAgICAgICAgICAiMyIgPSAiSW5maWx0cmF0aW5nIE5LIGNlbGxzIiwgIyBQVEdEUyxDWDNDUjEgKGluZmlsdCkKICAgICAgICAgICAgICAgIjQiID0gIklnQSsgUGxhc21hIGNlbGxzIiwKICAgICAgICAgICAgICAgIjUiID0gIkIgY2VsbHMiLAogICAgICAgICAgICAgICAiNiIgPSAiSWdHKyBQbGFzbWEgY2VsbHMiLAogICAgICAgICAgICAgICAiNyIgPSAiRGl2aWRpbmcgTksgY2VsbHMiLAogICAgICAgICAgICAgICAiOCIgPSAiYWItVCBjZWxscyAoc3RyZXNzKSIpCgphbGxfbF9jZWxscyRseW1waG9pZF9hbm5vdCA9IG5ld19sX2xhYnNbYXMuY2hhcmFjdGVyKGFsbF9sX2NlbGxzJHBjYTI1X3Jlcy4wLjQpXQpgYGAKClN1YnNldCBUL05LIGNlbGxzCgpgYGB7cn0KaW1tdW5lX3BvcHMgPSBjKCJhYi1UIGNlbGxzIDEiLCAiYWItVCBjZWxscyAyIiwgIk5LL2dkLVQgY2VsbHMiLCAiSW5maWx0cmF0aW5nIE5LIGNlbGxzIikKYWxsX3RfY2VsbHMgPSBhbGxfbF9jZWxsc1ssYWxsX2xfY2VsbHNAbWV0YS5kYXRhJGx5bXBob2lkX2Fubm90ICVpbiUgaW1tdW5lX3BvcHNdCmFsbF90X2NlbGxzID0gc3VwcHJlc3NXYXJuaW5ncyhTQ1RyYW5zZm9ybShhbGxfdF9jZWxscywgZG8uY29ycmVjdC51bWkgPSBULCB2ZXJib3NlID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcz1jKCJ1bmlxdWVfbmFtZSIsIm5Db3VudF9STkEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmVhdHVyZXMucnYudGggPSAxLCBzZWVkLnVzZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi5vbmx5LnZhci5nZW5lcyA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5mZWF0dXJlcy5uID0gTlVMTCkpCmFsbF90X2NlbGxzID0gUnVuUENBKGFsbF90X2NlbGxzLCB2ZXJib3NlID0gRikKYWxsX3RfY2VsbHMgPSBSdW5VTUFQKGFsbF90X2NlbGxzLCBkaW1zID0gMToyNSwgdmVyYm9zZSA9IEYpCkRpbVBsb3QoYWxsX3RfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiQ29uZGl0aW9uIikKRGltUGxvdChhbGxfdF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJhbGxjZWxsc19jbHVzdGVycyIpCkRpbVBsb3QoYWxsX3RfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAibHltcGhvaWRfYW5ub3QiKQpEaW1QbG90KGFsbF90X2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkRvbm9yIikKRGltUGxvdChhbGxfdF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJQaGFzZSIpCkZlYXR1cmVQbG90KGFsbF90X2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGZlYXR1cmVzID0gYygiTUtJNjciLCAiQUxCIiwgIlMxMDBBOCIsICJDT0xFQzExIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5LRzciLCAiVFJHQzEiLCAiUFRQUkMiLCAiRVBDQU0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCIsICJUUkFDIiwgIkNEM0UiLCAiQ0Q4QSIpKQpgYGAKCkNsdXN0ZXIgYW5kIGdldCBtYXJrZXJzCgpgYGB7cn0KYWxsX3RfY2VsbHMgPSBGaW5kTmVpZ2hib3JzKGFsbF90X2NlbGxzLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZS5TTk4gPSAxLzUsIGZvcmNlLnJlY2FsYyA9IFQsIGdyYXBoLm5hbWUgPSAicGNhMjUiKQphbGxfdF9jZWxscyA9IEZpbmRDbHVzdGVycyhhbGxfdF9jZWxscywgYWxnb3JpdGhtID0gMiwgdmVyYm9zZSA9IEYsIGdyYXBoLm5hbWUgPSAicGNhMjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gc2VxKDAuMSwgMiwgMC4xKSkKRGltUGxvdChhbGxfdF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJwY2EyNV9yZXMuMC45IiwgbGFiZWwgPSBUKQpEaW1QbG90KGFsbF90X2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkRvbm9yIiwgbGFiZWwgPSBGKQpEaW1QbG90KGFsbF90X2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkNvbmRpdGlvbiIsIGxhYmVsID0gRikKRGltUGxvdChhbGxfdF9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJ0X2Fubm90IiwgbGFiZWwgPSBUKQoKYWxsX3RfY2VsbHMgPSBTZXRJZGVudChhbGxfdF9jZWxscywgdmFsdWUgPSAicGNhMjVfcmVzLjAuOSIpCm1rX3RjZWxscyA9IEZpbmRBbGxNYXJrZXJzKGFsbF90X2NlbGxzLCBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKd3JpdGUuY3N2KG1rX3RjZWxsc1tta190Y2VsbHMkcF92YWxfYWRqPD0wLjA1LF0sIAogICAgICAgICAgZmlsZSA9ICJyZXN1bHRzL2ltbXVuZS9tYXJrZXJzX3Rfc3VicG9wX2FsbC5jc3YiLCByb3cubmFtZXMgPSBULCBxdW90ZSA9IEYpCgpzYXZlUkRTKG1rX3RjZWxscywgZmlsZSA9ICIuL3Jlc3VsdHMvaW1tdW5lL2NsdXN0X21hcmtlcnNfdC5SRFMiKQoKbWs5NyA9IEZpbmRNYXJrZXJzKGFsbF90X2NlbGxzLCBpZGVudC4xID0gIjkiLCBpZGVudC4yID0gIjciLCAKICAgICAgICAgICAgICAgICAgIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMiwgcHNldWRvY291bnQudXNlID0gMC4xKQptazI2ID0gRmluZE1hcmtlcnMoYWxsX3RfY2VsbHMsIGlkZW50LjEgPSAiMiIsIGlkZW50LjIgPSAiNiIsCiAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKbWs4MTMgPSBGaW5kTWFya2VycyhhbGxfdF9jZWxscywgaWRlbnQuMSA9ICI4IiwgaWRlbnQuMiA9ICIxMyIsCiAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKYGBgCgoKCmBgYHtyfQojIGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzUwMDc2MzAvCm5ld190X2xhYnMgPSBjKCIwIiA9ICJOSyBjZWxscyAxIiwKICAgICAgICAgICAgICAgIjEiID0gIlRSTSBjZWxscyIsICMgbWF5IGhhdmUgQ0Q0IGFuZCBDRDg7IElUR0ExCiAgICAgICAgICAgICAgICIyIiA9ICJNQUlUIGNlbGxzIDIiLCAjIENYQ1I2LCBDQ1I2LCBDQ1I1LCBzb21lIFJPUkMgKG5vdCBERSB3aXRoIHRoZSBJTEMzKSwgc29tZSBaQlRCMTYKICAgICAgICAgICAgICAgIjMiID0gIk5LIGNlbGxzIDIiLAogICAgICAgICAgICAgICAiNCIgPSAiTksgY2VsbHMgMyIsCiAgICAgICAgICAgICAgICI1IiA9ICJDRDggYWItVCBjZWxscyAyIiwKICAgICAgICAgICAgICAgIjYiID0gIk1BSVQgY2VsbHMgMSIsICMgaGFyZCB0byBiZSBzdXJlLCBidXQgaGFzIG1hbnkgaGFsbG1hcmtzLCBldmVuIGhpZ2hlciBDRDhBCiAgICAgICAgICAgICAgICI3IiA9ICJJbmZpbHRyYXRpbmcgTksgY2VsbHMiLAogICAgICAgICAgICAgICAiOCIgPSAiTmFpdmUgQ0Q0KyBUIGNlbGxzIiwgCiAgICAgICAgICAgICAgICI5IiA9ICJnZC1UIGNlbGxzIiwgIyBDRDMrIHZzIGNsNywgVFJEQy9UUkcKICAgICAgICAgICAgICAgIjEwIiA9ICJDRDggYWItVCBjZWxscyAzIiwKICAgICAgICAgICAgICAgIjExIiA9ICJDRDggYWItVCBjZWxscyAxIiwKICAgICAgICAgICAgICAgIjEyIiA9ICJUcmVnIiwKICAgICAgICAgICAgICAgIjEzIiA9ICJJTEMzIikgIyBLSVQsIEFIUiwgUk9SQywgbm8gQ0QzL0NEOC9DRDQKCmFsbF90X2NlbGxzJHRfYW5ub3QgPSBuZXdfdF9sYWJzW2FzLmNoYXJhY3RlcihhbGxfdF9jZWxscyRwY2EyNV9yZXMuMC45KV0KYGBgCgoKIyMgTXllbG9pZCBjZWxsIGFuYWx5c2lzClN1YnNldCBNeWVsb2lkIGNlbGxzCgpgYGB7cn0KaW1tdW5lX3BvcHMgPSBjKCJjRENzIDIiLCAiTWFjcm9waGFnZXMiLCAiS3VwZmZlciBjZWxscyIsICJjRENzIDEiLCAicERDcyIpCmFsbF9tX2NlbGxzID0gYWxsY2VsbHNfY3NzWyxhbGxjZWxsc19jc3NAbWV0YS5kYXRhJGFsbGNlbGxzX2NsdXN0ZXJzICVpbiUgaW1tdW5lX3BvcHNdCmFsbF9tX2NlbGxzID0gc3VwcHJlc3NXYXJuaW5ncyhTQ1RyYW5zZm9ybShhbGxfbV9jZWxscywgZG8uY29ycmVjdC51bWkgPSBULCB2ZXJib3NlID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcz1jKCJ1bmlxdWVfbmFtZSIsIm5Db3VudF9STkEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmVhdHVyZXMucnYudGggPSAxLCBzZWVkLnVzZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi5vbmx5LnZhci5nZW5lcyA9IEYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5mZWF0dXJlcy5uID0gTlVMTCkpCmFsbF9tX2NlbGxzID0gUnVuUENBKGFsbF9tX2NlbGxzLCB2ZXJib3NlID0gRikKYWxsX21fY2VsbHMgPSBSdW5VTUFQKGFsbF9tX2NlbGxzLCBkaW1zID0gMToyNSwgdmVyYm9zZSA9IEYpCkRpbVBsb3QoYWxsX21fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiQ29uZGl0aW9uIikKRGltUGxvdChhbGxfbV9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJhbGxjZWxsc19jbHVzdGVycyIpCkRpbVBsb3QoYWxsX21fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiRG9ub3IiKQpEaW1QbG90KGFsbF9tX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIlBoYXNlIikKRmVhdHVyZVBsb3QoYWxsX21fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZmVhdHVyZXMgPSBjKCJNS0k2NyIsICJBTEIiLCAiUzEwMEE4IiwgIkNPTEVDMTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTktHNyIsICJUUkdDMSIsICJQVFBSQyIsICJFUENBTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0IiwgIlRSQUMiLCAiQ0QzRSIsICJDRDhBIikpCmBgYAoKQ2x1c3RlcmluZyBhbmQgbWFya2VycwoKYGBge3J9CmFsbF9tX2NlbGxzID0gRmluZE5laWdoYm9ycyhhbGxfbV9jZWxscywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ1bmUuU05OID0gMS81LCBmb3JjZS5yZWNhbGMgPSBULCBncmFwaC5uYW1lID0gInBjYTI1IikKYWxsX21fY2VsbHMgPSBGaW5kQ2x1c3RlcnMoYWxsX21fY2VsbHMsIGFsZ29yaXRobSA9IDIsIHZlcmJvc2UgPSBGLCBncmFwaC5uYW1lID0gInBjYTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHNlcSgwLjEsIDIsIDAuMSkpCkRpbVBsb3QoYWxsX21fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAicGNhMjVfcmVzLjAuNiIsIGxhYmVsID0gVCkKRGltUGxvdChhbGxfbV9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJEb25vciIsIGxhYmVsID0gRikKRGltUGxvdChhbGxfbV9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJDb25kaXRpb24iLCBsYWJlbCA9IEYpCkRpbVBsb3QoYWxsX21fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiYWxsY2VsbHNfY2x1c3RlcnMiLCBsYWJlbCA9IEYpCgphbGxfbV9jZWxscyA9IFNldElkZW50KGFsbF9tX2NlbGxzLCB2YWx1ZSA9ICJwY2EyNV9yZXMuMC42IikKbWtfbWNlbGxzID0gRmluZEFsbE1hcmtlcnMoYWxsX21fY2VsbHMsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMiwgcHNldWRvY291bnQudXNlID0gMC4xKQp3cml0ZS5jc3YobWtfbWNlbGxzW21rX21jZWxscyRwX3ZhbF9hZGo8PTAuMDUsXSwgCiAgICAgICAgICBmaWxlID0gInJlc3VsdHMvaW1tdW5lL21hcmtlcnNfbV9zdWJwb3BfYWxsLmNzdiIsIHJvdy5uYW1lcyA9IFQsIHF1b3RlID0gRikKCnNhdmVSRFMobWtfbWNlbGxzLCBmaWxlID0gIi4vcmVzdWx0cy9pbW11bmUvY2x1c3RfbWFya2Vyc19teWVsb2lkLlJEUyIpCgptazEwMTEgPSBGaW5kTWFya2VycyhhbGxfbV9jZWxscywgaWRlbnQuMSA9ICIxMCIsIGlkZW50LjIgPSAiMTEiLAogICAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKYGBgCgpBZGQgYW5ub3RhdGlvbnMKCmBgYHtyfQptcmtzX3EgPSBTb3VwWDo6cXVpY2tNYXJrZXJzKGFsbF9tX2NlbGxzQGFzc2F5cyRTQ1RAY291bnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9tX2NlbGxzQGFjdGl2ZS5pZGVudCwgTiA9IDEwKQpWaWV3KG1ya3NfcVttcmtzX3EkcXZhbDw9MC4wNSxdKQoKbmV3X21fbGFicyA9IGMoIjAiID0gIkt1cGZmZXIgY2VsbHMiLAogICAgICAgICAgICAgICAiMSIgPSAiTW9ub2N5dGVzL2NEQ3MiLAogICAgICAgICAgICAgICAiMiIgPSAiTWFjcm9waGFnZXMiLAogICAgICAgICAgICAgICAiMyIgPSAiTW9ub2N5dGVzL2NEQ3MiLAogICAgICAgICAgICAgICAiNCIgPSAiS3VwZmZlciBjZWxscyIsCiAgICAgICAgICAgICAgICI1IiA9ICJNb25vY3l0ZXMvY0RDcyIsCiAgICAgICAgICAgICAgICI2IiA9ICJNb25vY3l0ZXMvY0RDcyIsCiAgICAgICAgICAgICAgICI3IiA9ICJNYWNyb3BoYWdlcyIsCiAgICAgICAgICAgICAgICI4IiA9ICJNb25vY3l0ZXMvY0RDcyIsCiAgICAgICAgICAgICAgICI5IiA9ICJjREMxIiwKICAgICAgICAgICAgICAgIjEwIiA9ICJwRENzIiwKICAgICAgICAgICAgICAgIjExIiA9ICJwRENzIiwKICAgICAgICAgICAgICAgIjEyIiA9ICJEaXZpZGluZyBjRENzIiwKICAgICAgICAgICAgICAgIjEzIiA9ICJLdXBmZmVyIGNlbGxzIiwKICAgICAgICAgICAgICAgIjE0IiA9ICJIZXBhdG9jeXRlcyIpCgphbGxfbV9jZWxscyRteWVfYW5ub3QgPSBuZXdfbV9sYWJzW2FzLmNoYXJhY3RlcihhbGxfbV9jZWxscyRwY2EyNV9yZXMuMC42KV0KYGBgCgpTdWJzZXQgTW9ub2N5dGVzCgpgYGB7cn0KaW1tdW5lX3BvcHMgPSBjKCIyIiwgIjciLCAiMSIsICI2IiwgIjgiLCAiMyIsICI1IiwgIjQiLCAiMTMiLCAiMCIsICI5IikKYWxsX21vbl9jZWxscyA9IGFsbF9tX2NlbGxzWyxhbGxfbV9jZWxsc0BtZXRhLmRhdGEkcGNhMjVfcmVzLjAuNiAlaW4lIGltbXVuZV9wb3BzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9tX2NlbGxzQG1ldGEuZGF0YSRhbGxjZWxsc19jbHVzdGVycyAlaW4lIGMoIk1hY3JvcGhhZ2VzIiwgImNEQ3MgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjRENzIDIiLCAiS3VwZmZlciBjZWxscyIpXQphbGxfbW9uX2NlbGxzID0gc3VwcHJlc3NXYXJuaW5ncyhTQ1RyYW5zZm9ybShhbGxfbW9uX2NlbGxzLCBkby5jb3JyZWN0LnVtaSA9IFQsIHZlcmJvc2UgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycy50by5yZWdyZXNzPWMoInVuaXF1ZV9uYW1lIiwibkNvdW50X1JOQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5mZWF0dXJlcy5ydi50aCA9IDEsIHNlZWQudXNlID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLm9ubHkudmFyLmdlbmVzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZlYXR1cmVzLm4gPSBOVUxMKSkKYWxsX21vbl9jZWxscyA9IFJ1blBDQShhbGxfbW9uX2NlbGxzLCB2ZXJib3NlID0gRikKYWxsX21vbl9jZWxscyA9IFJ1blVNQVAoYWxsX21vbl9jZWxscywgZGltcyA9IDE6MjUsIHZlcmJvc2UgPSBGKQpEaW1QbG90KGFsbF9tb25fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiQ29uZGl0aW9uIikKRGltUGxvdChhbGxfbW9uX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImFsbGNlbGxzX2NsdXN0ZXJzIikKRGltUGxvdChhbGxfbW9uX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gInBjYTI1X3Jlcy4wLjYiKQpEaW1QbG90KGFsbF9tb25fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiRG9ub3IiKQpEaW1QbG90KGFsbF9tb25fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiUGhhc2UiKQpGZWF0dXJlUGxvdChhbGxfbW9uX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGZlYXR1cmVzID0gYygiTUtJNjciLCAiQUxCIiwgIlMxMDBBOCIsICJDT0xFQzExIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5LRzciLCAiVFJHQzEiLCAiUFRQUkMiLCAiRVBDQU0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCIsICJUUkFDIiwgIkNEM0UiLCAiQ0Q4QSIpKQpgYGAKCkNsdXN0ZXJpbmcgYW5kIG1hcmtlcnMKCmBgYHtyfQphbGxfbW9uX2NlbGxzID0gRmluZE5laWdoYm9ycyhhbGxfbW9uX2NlbGxzLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZS5TTk4gPSAxLzUsIGZvcmNlLnJlY2FsYyA9IFQsIGdyYXBoLm5hbWUgPSAicGNhMjUiKQphbGxfbW9uX2NlbGxzID0gRmluZENsdXN0ZXJzKGFsbF9tb25fY2VsbHMsIGFsZ29yaXRobSA9IDIsIHZlcmJvc2UgPSBGLCBncmFwaC5uYW1lID0gInBjYTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHNlcSgwLjEsIDIsIDAuMSkpCkRpbVBsb3QoYWxsX21vbl9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJwY2EyNV9yZXMuMC41IiwgbGFiZWwgPSBUKQpEaW1QbG90KGFsbF9tb25fY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiYWxsY2VsbHNfY2x1c3RlcnMiLCBsYWJlbCA9IFQpCkRpbVBsb3QoYWxsX21vbl9jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJEb25vciIsIGxhYmVsID0gRikKRGltUGxvdChhbGxfbW9uX2NlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkNvbmRpdGlvbiIsIGxhYmVsID0gRikKCmFsbF9tb25fY2VsbHMgPSBTZXRJZGVudChhbGxfbW9uX2NlbGxzLCB2YWx1ZSA9ICJwY2EyNV9yZXMuMC41IikKbWtfbW9uID0gRmluZEFsbE1hcmtlcnMoYWxsX21vbl9jZWxscywgbG9nZmMudGhyZXNob2xkID0gMC4yLCBwc2V1ZG9jb3VudC51c2UgPSAwLjEpCndyaXRlLmNzdihta19tb25bbWtfbW9uJHBfdmFsX2Fkajw9MC4wNSxdLCAKICAgICAgICAgIGZpbGUgPSAicmVzdWx0cy9pbW11bmUvbWFya2Vyc19tb25fc3VicG9wX2FsbC5jc3YiLCByb3cubmFtZXMgPSBULCBxdW90ZSA9IEYpCgpzYXZlUkRTKG1rX21vbiwgZmlsZSA9ICIuL3Jlc3VsdHMvaW1tdW5lL2NsdXN0X21hcmtlcnNfbW9uLlJEUyIpCgptazYxID0gRmluZE1hcmtlcnMoYWxsX21vbl9jZWxscywgaWRlbnQuMSA9ICI2IiwgaWRlbnQuMiA9ICIxIiwgCiAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQgPSAwLjIsIHBzZXVkb2NvdW50LnVzZSA9IDAuMSkKbWsyMSA9IEZpbmRNYXJrZXJzKGFsbF9tb25fY2VsbHMsIGlkZW50LjEgPSAiMiIsIGlkZW50LjIgPSAiMSIsIAogICAgICAgICAgICAgICAgICAgbG9nZmMudGhyZXNob2xkID0gMC4yLCBwc2V1ZG9jb3VudC51c2UgPSAwLjEpCmBgYAoKQWRkIGFubm90YXRpb25zCgpgYGB7cn0KbmV3X21fbGFicyA9IGMoIjAiID0gIkt1cGZmZXIgY2VsbHMiLAogICAgICAgICAgICAgICAiMSIgPSAiY0RDMiIsCiAgICAgICAgICAgICAgICIyIiA9ICJNb25vY3l0ZXMgKElHU0YyMSsgR1BSMzQrKSIsICMgc2ltaWxhciB0byB0aG9zZSBpZGVudGlmaWVkIGhlcmUgaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9zNDE1ODYtMDIwLTI5MjItNCAKICAgICAgICAgICAgICAgIjMiID0gIk1hY3JvcGhhZ2VzIChIRVM0KykiLCAjIHZlcnkgc2ltaWxhciB0byA1LCBIRVM0IGlzIG9uZSBvZiBpdHMgbW9zdCB1bmlxdWUgbWFya2VycwogICAgICAgICAgICAgICAiNCIgPSAiS3VwZmZlciBjZWxscyAoU1VDTlIxKykiLCAjIGRpc3Byb3ZlcyBodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUMxOTg2NTc1LzsgdGhlc2UgS0MgYXJlIGluZmxhbW1hdG9yeS9hbnRpdmlyYWwKICAgICAgICAgICAgICAgIjUiID0gIk1hY3JvcGhhZ2VzIiwKICAgICAgICAgICAgICAgIjYiID0gIk1vbm9jeXRlcyAoVFJFTTIrIENEOSspIiwgIyBpbiByYW1hY2hhbmRyYW4gZXQgYWwsIGFzc29jIHdpdGggZmlicm90aWMgc2NhcnMKICAgICAgICAgICAgICAgIyMgaW4gdGhlaXIgcHJvamVjdGlvbiwgYWxzbyBjbG9zZSB0byBLQwogICAgICAgICAgICAgICAiNyIgPSAiY0RDMiIsCiAgICAgICAgICAgICAgICI4IiA9ICJjREMxIiwKICAgICAgICAgICAgICAgIjkiID0gIk1vbm9jeXRlcyAoc2VjcmV0b3J5KSIsICMgcmVsYXRlZCB0byAyIGFuZCA2CiAgICAgICAgICAgICAgICIxMCIgPSAiYWN0aXZhdGVkIERDcyIpICMgQ0Q4MCwgQ0Q4NiwgQ0NSNwoKYWxsX21vbl9jZWxscyRtb25vX2Fubm90ID0gbmV3X21fbGFic1thcy5jaGFyYWN0ZXIoYWxsX21vbl9jZWxscyRwY2EyNV9yZXMuMC41KV0KYGBgCgoKIyMgUHV0IGFubm90YXRpb25zIG9uIHNpbmdsZSBpbW11bmUgY2VsbCBvYmplY3QKTWFrZSBkYXRhZnJhbWUgd2l0aCBuZXcgYW5ub3RhdGlvbnMKCmBgYHtyfQpuZXdhbm5vdF9sID0gbGlzdChsZGYgPSBhbGxfbF9jZWxsc0BtZXRhLmRhdGFbLGMoImFsbGNlbGxzX2NsdXN0ZXJzIiwgImx5bXBob2lkX2Fubm90IildLAogICAgICAgICAgICAgICAgICB0ZGYgPSBhbGxfdF9jZWxsc0BtZXRhLmRhdGFbLGMoImFsbGNlbGxzX2NsdXN0ZXJzIiwgInRfYW5ub3QiKV0sCiAgICAgICAgICAgICAgICAgIG1kZiA9IGFsbF9tX2NlbGxzQG1ldGEuZGF0YVssYygiYWxsY2VsbHNfY2x1c3RlcnMiLCAibXllX2Fubm90IildLAogICAgICAgICAgICAgICAgICBtb25kZiA9IGFsbF9tb25fY2VsbHNAbWV0YS5kYXRhWyxjKCJhbGxjZWxsc19jbHVzdGVycyIsICJtb25vX2Fubm90IildKQpmb3IobiBpbiBuYW1lcyhuZXdhbm5vdF9sKSl7CiAgbmV3YW5ub3RfbFtbbl1dJGNlbGxzID0gcm93bmFtZXMobmV3YW5ub3RfbFtbbl1dKQp9CgpuZXdhbm5vdF9kZiA9IFJlZHVjZShmdW5jdGlvbih4LHkpe21lcmdlKHgseSwgYnkgPSAiY2VsbHMiLCBhbGwgPSBUKX0sIG5ld2Fubm90X2wpWyxjKDEsMyw1LDcsOSldCgpuZXdhbm5vdF9kZiR0X2Fubm90W2lzLm5hKG5ld2Fubm90X2RmJHRfYW5ub3QpXSA9IG5ld2Fubm90X2RmJGx5bXBob2lkX2Fubm90W2lzLm5hKG5ld2Fubm90X2RmJHRfYW5ub3QpXQpuZXdhbm5vdF9kZiRtb25vX2Fubm90W2lzLm5hKG5ld2Fubm90X2RmJG1vbm9fYW5ub3QpXSA9IG5ld2Fubm90X2RmJG15ZV9hbm5vdFtpcy5uYShuZXdhbm5vdF9kZiRtb25vX2Fubm90KV0KbmV3YW5ub3RfZGYkaW1tdW5lX2Fubm90ID0gbmV3YW5ub3RfZGYkdF9hbm5vdApuZXdhbm5vdF9kZiRpbW11bmVfYW5ub3RbaXMubmEobmV3YW5ub3RfZGYkaW1tdW5lX2Fubm90KV0gPSBuZXdhbm5vdF9kZiRtb25vX2Fubm90W2lzLm5hKG5ld2Fubm90X2RmJGltbXVuZV9hbm5vdCldCgpuZXdhbm5vdF9kZiA9IGRhdGEuZnJhbWUocm93Lm5hbWVzID0gbmV3YW5ub3RfZGYkY2VsbHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgaW1tdW5lX2Fubm90ID0gbmV3YW5ub3RfZGYkaW1tdW5lX2Fubm90KQpgYGAKCkFkZCB0byB0aGUgaW1tdW5lIFNldXJhdCBvYmplY3QKCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CmFsbF9pbW1fY2VsbHMgPSBBZGRNZXRhRGF0YShhbGxfaW1tX2NlbGxzLCBtZXRhZGF0YSA9IG5ld2Fubm90X2RmKQojIHRoZSBvcmlnaW5hbCAiRGl2aWRpbmcgY2VsbHMiIHdpbGwgYmUgcmVsYWJlbGVkICJEaXZpZGluZyBUL05LIGNlbGxzIiwKIyMgYW5kIHRoZSBuZXdseSBhbm5vdGF0ZWQgIkRpdmlkaW5nIE5LIGNlbGxzIiB3aWxsIGJlIHJlbmFtZWQgdG8gbWF0Y2ggdGhpcwphbGxfaW1tX2NlbGxzJGltbXVuZV9hbm5vdFtpcy5uYShhbGxfaW1tX2NlbGxzJGltbXVuZV9hbm5vdCldID0gIkRpdmlkaW5nIFQvTksgY2VsbHMiCmFsbF9pbW1fY2VsbHMkaW1tdW5lX2Fubm90W2FsbF9pbW1fY2VsbHMkaW1tdW5lX2Fubm90PT0iRGl2aWRpbmcgTksgY2VsbHMiXSA9ICJEaXZpZGluZyBUL05LIGNlbGxzIgphbGxfaW1tX2NlbGxzJGltbXVuZV9hbm5vdFthbGxfaW1tX2NlbGxzJGltbXVuZV9hbm5vdD09IkhlcGF0b2N5dGVzIl0gPSAiSGVwYXRvY3l0ZS1Nb25vY3l0ZSBpbnRlcmFjdGlvbiIKCkRpbVBsb3QoYWxsX2xfY2VsbHMsIGdyb3VwLmJ5ID0gImx5bXBob2lkX2Fubm90IiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkrZ2d0aXRsZSgiTHltcGhvaWQgY2VsbHMiKQpEaW1QbG90KGFsbF90X2NlbGxzLCBncm91cC5ieSA9ICJ0X2Fubm90IiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkrZ2d0aXRsZSgiVCBhbmQgTksgY2VsbHMgKHN1YnNldCBvZiBMeW1waG9pZCkiKQpEaW1QbG90KGFsbF9tX2NlbGxzLCBncm91cC5ieSA9ICJteWVfYW5ub3QiLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsID0gVCkrTm9MZWdlbmQoKStnZ3RpdGxlKCJNeWVsb2lkIGNlbGxzIikKRGltUGxvdChhbGxfbW9uX2NlbGxzLCBncm91cC5ieSA9ICJtb25vX2Fubm90IiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkrZ2d0aXRsZSgiTW9ub2N5dGVzIGNlbGxzIChzdWJzZXQgb2YgTXllbG9pZCkiKQpEaW1QbG90KGFsbF9pbW1fY2VsbHMsIGdyb3VwLmJ5ID0gImFsbGNlbGxzX2NsdXN0ZXJzIiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkrZ2d0aXRsZSgiSW1tdW5lIGNlbGxzIChvcmlnaW5hbCBhbm5vdGF0aW9uKSIpCkRpbVBsb3QoYWxsX2ltbV9jZWxscywgZ3JvdXAuYnkgPSAiaW1tdW5lX2Fubm90IiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFQpK05vTGVnZW5kKCkrZ2d0aXRsZSgiSW1tdW5lIGNlbGxzIChuZXcgZGV0YWlsZWQgYW5ub3RhdGlvbikiKQpgYGAKClNhdmUgU2V1cmF0IG9iamVjdHMKCmBgYHtyfQpzYXZlUkRTKGFsbF9sX2NlbGxzLCBmaWxlID0gInJlc3VsdHMvaW1tdW5lL2FsbF9sX2NlbGxzLlJEUyIpCnNhdmVSRFMoYWxsX3RfY2VsbHMsIGZpbGUgPSAicmVzdWx0cy9pbW11bmUvYWxsX3RfY2VsbHMuUkRTIikKc2F2ZVJEUyhhbGxfbV9jZWxscywgZmlsZSA9ICJyZXN1bHRzL2ltbXVuZS9hbGxfbV9jZWxscy5SRFMiKQpzYXZlUkRTKGFsbF9tb25fY2VsbHMsIGZpbGUgPSAicmVzdWx0cy9pbW11bmUvYWxsX21vbl9jZWxscy5SRFMiKQpzYXZlUkRTKGFsbF9pbW1fY2VsbHMsIGZpbGUgPSAicmVzdWx0cy9pbW11bmUvYWxsX2ltbV9jZWxscy5SRFMiKQpgYGAKCgoKCgoKCgo=